const crcTable: any = [];

(function () {
  for (let i = 0; i < 256; i++) {
    let currentCrc = i;
    for (let j = 0; j < 8; j++) {
      if (currentCrc & 1) {
        currentCrc = 0xedb88320 ^ (currentCrc >>> 1);
      } else {
        currentCrc = currentCrc >>> 1;
      }
    }
    crcTable[i] = currentCrc;
  }
})();

export class CrcCalculator {
  // _crc = -1;
  // write(data) {
  //   for (let i = 0; i < data.length; i++) {
  //     this._crc = crcTable[(this._crc ^ data[i]) & 0xff] ^ (this._crc >>> 8);
  //   }
  //   return true;
  // }
  // crc32() {
  //   return this._crc ^ -1;
  // }
  static crc32(buf: ArrayBuffer) {
    const view = new DataView(buf);
    let crc = -1;
    for (let i = 0; i < buf.byteLength; i++) {
      crc = crcTable[(crc ^ view.getUint8(i)) & 0xff] ^ (crc >>> 8);
    }
    return crc ^ -1;
  }
}
